﻿using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using OfficeOpenXml;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using System.Diagnostics.Contracts;
using Newtonsoft.Json;
using System.Data;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Text.RegularExpressions;

namespace Store.Client.Controllers
{
    public class OrderController : Controller
    {
        //注册 导出帮助类
        private IWebHostEnvironment _hostingEnvironment;

        public OrderController(IWebHostEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }
        //订单列表
        public IActionResult Index()
        {
            return View();
        }

        //[HttpGet]
        ////导出订单
        //public ActionResult DaoContractList()
        //{
        //    //计算总条数
        //    var list = _PMContext.Query<Contract>().ToList();
        //    //转为json格式
        //    var json = JsonConvert.SerializeObject(list);
        //    //转为dataTable
        //    DataTable dt = new DataTable();
        //    dt = JsonConvert.DeserializeObject<DataTable>(json);
        //    var msg = string.Empty;//返回消息
        //    string[] sColumnName = { "订单编号", "提交时间", "用户账号", "订单金额", "支付方式", "订单来源", "订单状态"};

        //    //调用帮助类里的导出方法
        //    byte[] by = ExcelHelper.ExportExcel(dt, "", "导出信息", sColumnName, ref msg);
        //    return File(by, "application/ms-excel", "test.xlsx");
        //}

        /// <summary>
        /// 公用路径
        /// </summary>
        /// <returns></returns>
        private Tuple<string, string> GetTuple(string ExcelName)
        {
            string sWebRootFolder = _hostingEnvironment.WebRootPath;//获取根路径，core资源文件夹一般都在www.root目录下，关于这块可以看我的 .net app接口文章，那里详细介绍了这块。
            string sFileName = $"{ExcelName}.xlsx";
            return Tuple.Create(sWebRootFolder, sFileName);
        }

        //导出
        public IActionResult Export(DataTable data)
        {
            DataTable dtList = data;
            string sWebRootFolder = GetTuple("报表模板").Item1;
            string sFileName = GetTuple("报表模板").Item2;
            FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));//创建一个FileInfo实例，创建路径
            if (!System.IO.Directory.Exists(sWebRootFolder + sFileName))//文件是否存在如果存在删掉文件重新创建。
            {
                file.Delete(); //删除服务器上的临时文件
            }
            using (ExcelPackage package = new ExcelPackage(file))//创建excel
            {
                // 添加worksheet
                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("aspnetcore");
                //worksheet.Cells.Style.ShrinkToFit = true;//单元格自动适应大小
                for (int i = 1; i < 4; i++)
                {
                    worksheet.Column(i).Width = 25;//设置列宽
                }
                //添加头
                worksheet.Cells[1, 1].Value = "excel表格第一列标题";
                worksheet.Cells[1, 2].Value = "excel表格第二列标题";
                worksheet.Cells[1, 3].Value = "excel表格第三列标题";
                worksheet.Cells[1, 4].Value = "excel表格第四列标题";
                if (dtList != null && dtList.Rows.Count > 0)
                {
                    //添加值
                    int Count = 1;
                    for (int i = 0; i < dtList.Rows.Count; i++)
                    {
                        Count++;
                        DataRow item = dtList.Rows[i];//创建行                   
                        worksheet.Cells[Count, 1].Value = item["orderId"].ToString();
                        worksheet.Cells[Count, 2].Value = item["orderState"].ToString();
                        worksheet.Cells[Count, 2].Value = item["orderNumber"].ToString();
                        worksheet.Cells[Count, 3].Value = item["orderCreateTime"].ToString();
                        worksheet.Cells[Count, 5].Value = item["orderPrice"].ToString();
                        worksheet.Cells[Count, 6].Value = item["orderPayment"].ToString();
                        worksheet.Cells[Count, 7].Value = item["orderSource"].ToString();
                        worksheet.Cells[Count, 4].Value = item["orderSum"].ToString();
                        worksheet.Cells[Count, 4].Value = item["commodityName"].ToString();
                        worksheet.Cells[Count, 8].Value = item["articleNumber"].ToString();
                        worksheet.Cells[Count, 4].Value = item["commodityPrice"].ToString();
                    }

                }
                package.Save();//保存
            }

            return File(sFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "导出数据.xlsx");//导出excel表格
        }

        

        //导入
        //[HttpPost]
        //public IActionResult Import(IFormFile excelfile)
        //{
        //    string sWebRootFolder = GetTuple("报表模板").Item1;
        //    string sFileName = GetTuple("报表模板").Item2;
        //    FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
        //    string[] FileType = excelfile.FileName.Split('.');
        //    if (FileType[1] != "xlsx" && FileType[1] != "xls")
        //    {
        //        ///financemanage/ledger/list
        //        return Content("你导如的文件格式不正确，请导入excel文件格式（.xlsx,xls)");
        //    }

        //    if (!System.IO.Directory.Exists(sWebRootFolder + sFileName))//判断路径是否存在
        //    {
        //        file.Delete(); //删除服务器上的临时文件
        //    }
        //    try
        //    {
        //        //FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方。
        //        //Create：文件存在删除该文件，不存在创建新文件。
        //        using (FileStream fs = new FileStream(file.ToString(), FileMode.Create))
        //        {
        //            excelfile.CopyTo(fs);
        //            fs.Flush();
        //        }
        //        using (ExcelPackage package = new ExcelPackage(file))
        //        {
        //            StringBuilder sb = new StringBuilder();
        //            ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
        //            int rowCount = worksheet.Dimension.Rows;
        //            int ColCount = worksheet.Dimension.Columns;
        //            bool isTrue = false;
        //            //////////////////////////////////////////////////////////////////////////////////////
        //            //注意在导入报表时，并不是能将导入就万事大吉了，要判断一下excel表里的数据是否和你要求的数据匹配，例如：时间数据，整型数据，浮点型数据，excel表中的每一列数据类型都要与你要求的每一列数据里类型匹配。
        //            // 这时就需要我们自己在读取excel表中的数据时，自己去一个一个审查了。审查一般也有两种方式：
        //            //  1，表中数据哪一行数据不通过，就过滤掉不通过的数据，通过的数据还按原方式导入，不通过的输出第几行，第几列的错误信息，比如：第二行，第三列，时间格式错误！（可以边判断边导入，一行通过就导入一行）
        //            //  2，表中数据只要有一行不通过，整个表中的数据都不能导入，不通过的输出第几行，第几列的错误信息，比如：第二行，第三列，时间格式错误！（先判断后导入，就是先对整个表数据进行匹配，只要都通过了，才能导入）                    
        //            //  我在这里做的事第二种方式，至于选哪种方式要根据业务情况的。下面就是如何匹配数据了。
        //            //  比如我要导入的数据有四行，第一行时string，第二行是：int  第三行是：float 第四行是：datatime  格式是（2019/10/23） 注意：时间格式要尽量定一个统一模式 

        //            for (int row = 2; row <= rowCount; row++)//在excel表中第一行是标题，所以数据是从第二行开始的。
        //            {
        //                for (int col = 1; col <= ColCount; col++)
        //                {
        //                    if (col > 1 && col < 4)
        //                    {
        //                        if (worksheet.Cells[row, col].Value.ToString().Length == 0)//表中数据有可能是空，如果是字符格式就无所谓了，但是如果是整型或者浮点型，那就要判一下，给个默认值0了
        //                        {
        //                            worksheet.Cells[row, col].Value = 0;
        //                        }
        //                        if (!Regex.IsMatch(worksheet.Cells[row, col].Value.ToString(), @"^[+-]?\d*[.]?\d*$"))//大家知道，整型可以转浮点型，例如：float a  可以 a=1.0 也可以  a=1所以两个一块直接判断了。
        //                        {
        //                            if (isTrue == false)
        //                            {
        //                                sb.Append("导入文件失败！" + "\t");
        //                                sb.Append("        有一下错误：" + "\t");
        //                            }
        //                            sb.Append("第" + row + "行" + col + "列数据类型错误！" + "\t");
        //                            isTrue = true;
        //                        }
        //                    }
        //                    // Regex reg = new Regex(@"^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|30|31)/([1-9]\d{3})$", RegexOptions.None | RegexOptions.IgnoreCase | RegexOptions.Multiline);
        //                    // MatchCollection mc = reg.Matches(worksheet.Cells[row, col].Value.ToString());
        //                    //^(?\d{2,4})/(?\d{1,2})/(?\d{1,2})$
        //                    if (col == 4)
        //                    {
        //                        if (SelectDateTime(worksheet.Cells[row, col].Value.ToString()))//判断时间格式在SelectDatatime方法中处理的，在下面
        //                        {
        //                            if (isTrue == false)
        //                            {
        //                                sb.Append("导入文件失败！" + "\t");
        //                                sb.Append("        有一下错误：" + "\t");
        //                            }
        //                            sb.Append("第" + row + "行" + col + "列时间格式类型错误！" + "\t");
        //                            isTrue = true;
        //                        }
        //                    }
        //                }
        //                sb.Append(Environment.NewLine);//重新起一行
        //            }
        //            if (isTrue == true)
        //            {
        //                return Content(sb.ToString());   //如果isture==true 说明有错误数据就直接返回错误数据，就不再进行导入操作了。
        //            }
        //            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //            //下面是，如果所有数据都匹配成功了，那就要执行导入操作了。
        //            for (int row = 2; row <= rowCount; row++)
        //            {
        //                int orderId = int.Parse(worksheet.Cells[row, 1].Value.ToString());
        //                string orderNumber = worksheet.Cells[row, 2].Value.ToString();
        //                DateTime orderCreateTime = DateTime.Parse(worksheet.Cells[row, 3].Value.ToString());
        //                string userPhone = worksheet.Cells[row, 4].Value.ToString();
        //                string orderPrice = worksheet.Cells[row, 5].Value.ToString();
        //                string orderPayment = worksheet.Cells[row, 6].Value.ToString();
        //                string orderSource = worksheet.Cells[row, 7].Value.ToString();
        //                string orderState = worksheet.Cells[row, 8].Value.ToString();
        //                //下面就是如何把excel表中的数据插入数据库了，两种方式：
        //                //1，数据一行一行插入。2，将数据存入DadaTable中整体存入。具体要看数据量了。
        //                //例如一行一行插入可以直接在for循环中直接插入就行了。
        //                //--插入的sql语句
        //                //--存储过程名
        //            }
        //            file.Delete();//删除刚创建的临时文件。
        //            return Redirect("/ReportManage/Finance_CostNoTower/List");
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        return Content(ex.Message);
        //    }
        //}
        //public bool SelectDateTime(string strtime)
        //{
        //    try
        //    {
        //        DateTime.Parse(strtime);//笼统的判断字符串格式是否是时间格式 
        //    }
        //    catch
        //    {
        //        return true;
        //    }
        //    string StrTime = strtime;
        //    //判断系统读取的时间格式是否和文件中的时间格式一致
        //    //例如文件上时间格式是"2019/07"而系统读取格式是："2019/07/01 星期一 0:00:00"
        //    if (strtime.Length > 7)
        //    {
        //        //如果不一致，取第一个空格前的字符串。
        //        StrTime = strtime.Substring(0, strtime.IndexOf(' '));
        //    }
        //    //系统定义excel文件中时间格式是"2019/07"或者"2019/7"如果是其它格式则认为是错误时间格式。
        //    if (!StrTime.Contains('/'))
        //    {
        //        return true;
        //    }
        //    return false;

        //}
    }
}
